#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;

struct Point
{
	double x, y;
	Point () {}
	Point (double _x, double _y) : x(_x), y(_y) {}
	Point operator + (Point a)
	{
		return Point(x + a.x, y + a.y);
	}
	Point operator - (Point a)
	{
		return Point(x - a.x, y - a.y);
	}
	double operator * (Point a)
	{
		return x * a.y - y * a.x;
	}
	double operator % (Point a)
	{
		return x * a.x + y * a.y;
	}
	void scan()
	{
		scanf("%lf%lf", &x, &y);
	}
	void print()
	{
		printf("%lf %lf\n", x, y);
	}
};

const int N = (int)1e5 + 10;
Point p[N];
vector <int> g[N];
int euler[N];
int used[N][4];
int indE = 0;

double getAngle(Point A, Point B, Point C)
{
	Point v = A - B;
	Point u = C - A;
	return fabs(atan2(v * u, v % u));
}

void setUsed(int v, int index)
{
	used[v][index] = 1;
	int to = g[v][index];
	for (int i = 0; i < (int)g[to].size(); i++)
	{
		if (g[to][i] == v)
			used[to][i] = 1;
	}
}


void findEuler(int v, int prev = -1)
{
	if (prev == -1)
	{
		setUsed(v, 0);
		findEuler(g[v][0], v);
		euler[indE++] = v;
		return;
	}
	double minAngle = 1e9;
	int to = -1;
	for (int i = 0; i < (int)g[v].size(); i++)
	{
		if (used[v][i])
			continue;
		Point A = p[v];
		Point B = p[prev];
		Point C = p[g[v][i]];
		double curAngle = getAngle(A, B, C);
		Point L = Point(0, 0), R = Point(0, 0);
		int cc = 0;
		used[v][i] = 1;
		for (int s = 0; s < (int)g[v].size(); s++)
		{
			if (used[v][s])
				continue;
			if (cc == 0)
				L = p[g[v][s]];
			else
				R = p[g[v][s]];
			cc++;
		}
		used[v][i] = 0;
		if (cc != 0)
			curAngle += getAngle(p[v], L, R);
		if (curAngle < minAngle)
		{
			minAngle = curAngle;
			to = i;
		}
	}
	if (to != -1)
	{
		setUsed(v, to);
		findEuler(g[v][to], v);
	}
	euler[indE++] = v;
}

int main()
{
//	freopen ("input.txt", "r", stdin);
//	freopen ("output.txt", "w", stdout);
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)
		p[i].scan();

	for (int i = 0; i < m; i++)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		g[a].push_back(b);
		g[b].push_back(a);
	}

	findEuler(0);
	double ans = 0;
	indE--;
	for (int i = 1; i <= indE; i++)
	{
		Point A = p[euler[i - 1]];
		Point B = p[euler[i % indE]];
		Point C = p[euler[(i + 1) % indE]];
		ans += getAngle(B, A, C);
	}

	printf("%.10lf", ans);
	return 0;
}
